// 常用的一些工具方法
import Vue from 'vue'

const vue = new Vue()

// 是否是数字
export function isNumber(val) {
  if (!val) return false
  val = val.trim()
  if (val === '') {
    return false
  }
  if (!isNaN(val)) {
    return true
  } else {
    return false
  }
}

// 格式化数字
export function formatNumber(n) {
  const str = n.toString()
  return str[1] ? str : `0${str}`
}

// 正整数
export function integer(n) {
  const str = /^\+?[1-9][0-9]*$/
  if (str.test(n)) {
    return true
  } else {
    return false
  }
}

// 手机号
export function phone(n) {
  const str = /^1\d{10}$/
  // return str.test(n)
  if (str.test(n)) {
    return true
  } else {
    return false
  }
}

// 格式化时间
export function formatTime(date) {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()

  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  const t1 = [year, month, day].map(formatNumber).join('-')
  const t2 = [hour, minute, second].map(formatNumber).join(':')

  return `${t1} ${t2}`
}
// 格式化时间  例如3月18日 18:00
export function formatTimeToMD(time) {
  let date = new Date(time.replace(/-/g, '/'))
  let year = date.getFullYear()
  let month = date.getMonth() + 1 < 10 ? (date.getMonth() + 1) : date.getMonth() + 1
  let day = date.getDate() < 10 ? date.getDate() : date.getDate()
  let hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  let minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  return year + '年' + month + '月' + day + '日 ' + hours + ':' + minutes
}
// 格式化时间
export function formatTimeToDate(time, pattern) {
  // 时间格式化函数，此处仅针对yyyy-MM-dd hh:mm:ss 的格式进行格式化
  var date = new Date(time)
  var year = date.getFullYear()
  /* 在日期格式中，月份是从0开始的，因此要加0
   * 使用三元表达式在小于10的前面加0，以达到格式统一  如 09:11:05
   * */
  var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  // var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  // var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  // var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  // 拼接
  if (pattern === 'yyyy-MM') {
    return year + '-' + month
  }
  if (pattern === 'yyyy-MM-dd') {
    return year + '-' + month + '-' + day
  }
  if (pattern === 'yyyy/MM') {
    return year + '/' + month
  }
  if (pattern === 'yyyy/MM/dd') {
    return year + '/' + month + '/' + day
  }
}

// 时间戳转换 将 '2019-12-12 00:00:00' 转为 '2019/12/12 00:00:00'
export function formatTimeStamp(time) {
  let stamp = time.replace(/-/g, '/')
  return new Date(stamp).getTime()
}

// 格式化年-月 2019-02
export function formatYearMonth(date) {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const t1 = [year, month].map(formatNumber).join('-')
  return `${t1}`
}

// 去掉头尾部的字符x
export function trimStr(str, char) {
  if (!str || !char) return str
  // 去掉左右空白
  str = str.trim()
  if (str.length > char.length) {
    // 左边
    let strLeft = str.substring(0, char.length)
    strLeft = strLeft.replace(new RegExp(char, 'g'), '')
    // 中间不替换部分
    const strMid = str.substring(char.length, str.length - char.length)
    // 右边
    let strRight = str.substring(str.length - char.length, str.length)
    strRight = strRight.replace(new RegExp(char, 'g'), '')
    str = strLeft + strMid + strRight
    console.log(str)
  }
  return str
}

// 截取地址到XX区XX路
export function addressCut(address) {
  const reg = /.+?(省|市|自治区|自治州|县|区)/g
  let selProCity = ''
  if (!address.match(reg)) return address
  if (address.match(reg)[1]) {
    selProCity = address.match(reg)[0] + address.match(reg)[1]
  } else {
    selProCity = address.match(reg)[0]
  }
  if (address.match(reg)[0].indexOf('市') !== -1 || address.match(reg)[0].indexOf('行政区') !== -1) {
    selProCity = address.match(reg)[0]
  }
  if (address.match(reg)[0].indexOf('自治区') !== -1) {
    selProCity = address.match(reg)[0] + address.match(reg)[1]
  }
  address = address.replace(new RegExp('(' + selProCity + ')', 'g'), '')
  return address
}

// 截取地址中XX省XX市XX区
export function addressNameCut(address) {
  const reg = /.+?(省|市|自治区|自治州|县|区)/g
  let selProName = []
  let sleProArr = []
  if (!address.match(reg)) return address
  selProName = address.match(reg)
  // 含有X省X市X区（例如福建省厦门市湖里区）
  if (selProName.length > 2) {
    if (address.match(reg)[0].indexOf('省') !== -1 && address.match(reg)[1].indexOf('市') !== -1 && (address.match(reg)[2].indexOf('市') !== -1 || address.match(reg)[2].indexOf('区') !== -1 || address.match(reg)[2].indexOf('县') !== -1 || address.match(reg)[2].indexOf('镇') !== -1)) {
      sleProArr = selProName.slice(0, 3)
    }
  }
  // 含有X省X市（例如广东省中山市X镇或者广东省中山市X路）
  if (selProName.length < 3) {
    if (address.match(reg)[0].indexOf('省') !== -1 && address.match(reg)[1].indexOf('市') !== -1) {
      sleProArr = selProName.slice(0, 2)
    }
  }
  // 不存在X省，含有X市X区（例如上海市长宁区）
  if (selProName.length > 1) {
    if (address.match(reg)[0].indexOf('省') === -1 && address.match(reg)[0].indexOf('市') !== -1 && (address.match(reg)[1].indexOf('区') !== -1 || address.match(reg)[1].indexOf('县') !== -1 || address.match(reg)[1].indexOf('镇') !== -1)) {
      sleProArr = selProName.slice(0, 2)
    }
    // 安卓手机，微信返回上海市上海市浦东新区兰花路333号
    if (address.match(reg)[0].indexOf('省') === -1 && address.match(reg)[0].indexOf('市') !== -1 && address.match(reg)[1].indexOf('市') !== -1 && (address.match(reg)[2].indexOf('区') !== -1 || address.match(reg)[2].indexOf('县') !== -1 || address.match(reg)[2].indexOf('镇') !== -1)) {
      sleProArr = selProName.slice(1, 3)
    }
  }
  // 不存在X省，含有X自治区X市（例如内蒙古自治区呼伦贝尔市新巴尔虎左旗G301(中央街)）
  if (selProName.length > 1) {
    if (address.match(reg)[0].indexOf('省') === -1 && address.match(reg)[0].indexOf('自治区') !== -1 && address.match(reg)[1].indexOf('市') !== -1) {
      sleProArr = selProName.slice(0, 2)
    }
  }
  // 不存在X省，含有X自治区X市X区（例如内蒙古自治区包头市昆都仑区）
  if (selProName.length > 2) {
    if (address.match(reg)[0].indexOf('省') === -1 && address.match(reg)[0].indexOf('自治区') !== -1 && address.match(reg)[1].indexOf('市') !== -1 && (address.match(reg)[2].indexOf('区') !== -1 || address.match(reg)[2].indexOf('县') !== -1 || address.match(reg)[2].indexOf('镇') !== -1)) {
      sleProArr = selProName.slice(0, 3)
    }
  }
  // 含有X省X自治州
  if (selProName.length > 1) {
    if (address.match(reg)[0].indexOf('省') !== -1 && address.match(reg)[1].indexOf('自治州') !== -1) {
      sleProArr = selProName.slice(0, 2)
    }
  }
  // 含有X省X自治州X市/X县
  if (selProName.length > 2) {
    if (address.match(reg)[0].indexOf('省') !== -1 && address.match(reg)[1].indexOf('自治州') !== -1 && (address.match(reg)[2].indexOf('市') !== -1 || address.match(reg)[2].indexOf('县') !== -1 || address.match(reg)[2].indexOf('镇') !== -1)) {
      sleProArr = selProName.slice(0, 3)
    }
  }
  // 澳门特别行政区澳门特别行政区澳门岛葡京路
  // 没有X省X特别行政区XX
  if (selProName.length > 0) {
    if (address.match(reg)[0].indexOf('省') === -1 && address.match(reg)[0].indexOf('特别行政区') !== -1) {
      sleProArr = selProName.slice(0, 1)
    }
  }
  // console.log('11 sleProArr', sleProArr)
  // console.log('22 sleProArr', selProName)
  let selProNameStr = ''
  selProNameStr = sleProArr.join('')
  return selProNameStr
}

// 截取城市名
export function cityCut(address, name) {
  const reg = /.+?(省|市|自治区|自治州|县|区)/g
  let cityName = ''
  if (!address.match(reg)) {
    if (name) {
      cityName = getStrByLens(name, 8)
    }
    return cityName
  }
  if (address.match(reg)[1]) {
    cityName = address.match(reg)[1]
  } else {
    cityName = address.match(reg)[0]
  }
  if (address.match(reg)[0].indexOf('市') !== -1 || address.match(reg)[0].indexOf('行政区') !== -1) {
    cityName = address.match(reg)[0]
  }
  if (address.match(reg)[0].indexOf('自治区') !== -1) {
    cityName = address.match(reg)[1]
  }
  if (cityName.indexOf('市') !== -1) {
    cityName = cityName.replace(/市/, '')
  }
  if (cityName.indexOf('特别行政区') !== -1) {
    cityName = cityName.replace(/特别行政区/, '')
  }
  return cityName
}

// 身份证号码
export function checkUserIdCode(value) {
  let resValue = true
  let IDRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
  let IDre15 = /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
  if (IDRe18.test(value) || IDre15.test(value)) {
    resValue = true
  } else {
    resValue = false
  }
  return resValue
}

// 军官证号码
export function checkMilitaryIdCode(value) {
  let resValue = true
  let IDRe = /^[a-zA-Z0-9]{7,21}$/
  if (IDRe.test(value)) {
    resValue = true
  } else {
    resValue = false
  }
  return resValue
}

// 护照号码、其他
export function checkPassPortIdCode(value) {
  let resValue = true
  let IDRe = /^[a-zA-Z0-9]{3,21}$/
  if (IDRe.test(value)) {
    resValue = true
  } else {
    resValue = false
  }
  return resValue
}

/**
 * 对象转数组
 * @param {obj} 原始对象
 * @param {colArr} 字段名称数组 ['label', 'value']
 * @returns 数组
 */
export function objToArr(obj, colArr) {
  const arr = []
  const _a = colArr[0]
  const _b = colArr[1]
  Object.keys(obj).forEach(function(key) {
    const _obj = {}
    _obj[_a] = obj[key]
    _obj[_b] = key
    arr.push(_obj)
  })
  return arr
}

/**
 * 控制字符串长度，支持中英字符串
 * @param {str} 字符串
 * @param {n} 长度
 * @returns 长度为n的字符串
 */
export function getStrByLength(str, n) {
  if (str) {
    const r = /[^\x00-\xff]/g
    if (str.replace(r, 'mm').length <= n) {
      return str
    }
    const m = Math.floor(n / 2)
    for (let i = m; i < str.length; i++) {
      if (str.substr(0, i).replace(r, 'mm').length >= n) {
        return str.substr(0, i) + '...'
      }
    }
  } else {
    str = ''
  }
  return str
}

/**
 * 控制字符串长度，支持中英字符串，不加...
 * @param {str} 字符串
 * @param {n} 长度
 * @returns 长度为n的字符串
 */
export function getStrByLens(str, n) {
  if (str) {
    const r = /[^\x00-\xff]/g
    if (str.replace(r, 'mm').length <= n) {
      return str
    }
    const m = Math.floor(n / 2)
    for (let i = m; i < str.length; i++) {
      if (str.substr(0, i).replace(r, 'mm').length >= n) {
        return str.substr(0, i)
      }
    }
  } else {
    str = ''
  }
  return str
}

/**
 * object对象深拷贝
 * @param {source} 原对象
 * @returns 目标对象
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'shallowClone')
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach((keys) => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = source[keys].constructor === Array ? [] : {}
      targetObj[keys] = deepClone(source[keys])
    } else {
      targetObj[keys] = source[keys]
    }
  })
  return targetObj
}

// 是否是json字符串
export function isJsonString(str) {
  if (!str) return false
  try {
    if (typeof JSON.parse(str) === 'object') {
      return true
    }
  } catch (e) {
    return false
  }
  return false
}

// 获取过去半年日期数据，年-月 2019-02
export function getPastMonths() {
  const dataArr = []
  const data = new Date()
  data.setMonth(data.getMonth() + 1, 1) // 获取到当前月份,设置月份
  for (var a = 0; a < 6; a++) {
    data.setMonth(data.getMonth() - 1) // 每次循环一次 月份值减1
    let m = data.getMonth() + 1
    m = m < 10 ? '0' + m : m
    dataArr.push(data.getFullYear() + '-' + m)
  }
  return dataArr
}

// has参数截取转对象
export function getCaption(linkParams) {
  let arr = linkParams.split('?')
  let params = arr[1].split('&')
  let obj = {}
  for (let i = 0; i < params.length; i++) {
    let param = params[i].split('=')
    obj[param[0]] = param[1]
  }
  return obj
}

/**
 * canvas绘制文字，自动换行
 * @param 1、canvas对象，2、文本 3、距离左侧的距离 4、距离顶部的距离 5、行高 6、文本的宽度
 * @returns 返回文本的高度
 */
export function drawText(ctx, str, leftWidth, initHeight, lineHeight, canvasWidth) {
  // 去掉左右空白
  if (str) str = str.trim()
  let lineWidth = 0
  let lastSubStrIndex = 0 // 每次开始截取的字符串的索引
  let textHeight = initHeight
  for (let i = 0; i < str.length; i++) {
    lineWidth += ctx.measureText(str[i]).width
    if (lineWidth > canvasWidth) {
      ctx.fillText(str.substring(lastSubStrIndex, i), leftWidth, initHeight) // 绘制截取部分
      initHeight += lineHeight // 增加行高
      lineWidth = 0
      lastSubStrIndex = i
      textHeight += lineHeight
    }
    if (i === str.length - 1) { // 绘制剩余部分
      ctx.fillText(str.substring(lastSubStrIndex, i + 1), leftWidth, initHeight)
    }
  }
  // 返回文本的高度
  return textHeight
}

/**
 * 生成笛卡尔积
 * @param 原数组
 * @returns 笛卡尔积数组
 */
export function descartes(array) {
  if (array.length < 2) return array[0] || []
  return [].reduce.call(array, function(col, set) {
    const res = []
    col.forEach(function(c) {
      set.forEach(function(s) {
        const t = [].concat(Array.isArray(c) ? c : [c])
        t.push(s)
        res.push(t)
      })
    })
    return res
  })
}

/**
 * 是否是isIPhoneX系列
 */
export function isIPhoneX() {
  // iPhone X, iPhone Xr, iPhone Xs
  return vue.$pt.getSystemInfoSync().model.indexOf('iPhone X') >= 0
}

/**
 * 封装的提示
 */
const showToast = obj => vue.$pt.showToast({
  title: obj.title ? obj.title : '',
  icon: obj.icon ? obj.icon : 'none',
  duration: obj.duration ? obj.duration : 1500,
  mask: obj.mask,
  image: obj.image || ''
})

/**
 * 设置我的名片Id
 */
export function setMyId(id) {
  vue.$pt.setStorageSync('myId', id)
}
/**
 * 获取我的名片Id
 */
export function getMyId(name) {
  vue.$pt.getStorageSync(name)
}
/**
 * 删除我的名片Id
 */
export function removeMyId(name) {
  vue.$pt.removeStorageSync(name)
}
/**
 * 设置授权登录层
 */
export function setGetUserInfo(value) {
  vue.$pt.setStorageSync('getUserInfo', value)
}
/**
 * 获取授权登录层
 */
export function getGetUserInfo(name) {
  vue.$pt.getStorageSync(name)
}
/**
 * 删除授权登录层
 */
export function removeGetUserInfo(name) {
  vue.$pt.removeStorageSync(name)
}
/**
 * 倒计时时间封装
 */
let Time = {
  // 获取当前时间戳
  getUnix: function() {
    var date = new Date()
    return date.getTime()
  },
  // 获取今天0点0分0秒的时间戳
  getTodayUnix: function() {
    var date = new Date()
    date.setHours(0)
    date.setMinutes(0)
    date.setSeconds(0)
    date.setMilliseconds(0)
    return date.getTime()
  },
  //   获取今年1月1日0点0分0秒的时间戳
  getYearUnix: function() {
    var date = new Date()
    date.setMonth(0)
    date.setDate(1)
    date.setHours(0)
    date.setMinutes(0)
    date.setSeconds(0)
    date.setMilliseconds(0)
    return date.getTime()
  },
  // 获取标准年月日
  getLastDate: function(time) {
    var date = new Date(time)
    var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
    var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
    return date.getFullYear() + '-' + month + '-' + day
  },
  //   转换时间
  getFormatTime: function(timestamp) {
    var now = this.getUnix()
    var timer = (timestamp - now) / 1000
    var tip = {
      day: 0,
      hour: 0,
      minute: 0,
      second: 0
    }
    if (timer <= 0) {
      return false
    } else {
      tip.day = Math.floor(timer / 86400)
      tip.hour = Math.floor((timer % 86400) / 3600)
      tip.minute = Math.floor(((timer % 86400) % 3600) / 60) < 10 ? '0' + Math.floor(((timer % 86400) % 3600) / 60) : Math.floor(((timer % 86400) % 3600) / 60)
      tip.second = Math.floor(((timer % 86400) % 3600) % 60) < 10 ? '0' + Math.floor(((timer % 86400) % 3600) % 60) : Math.floor(((timer % 86400) % 3600) % 60)
    }
    if (tip.second === '00' && tip.minute !== '00') {
      tip.minute -= 1
    }
    if (tip.minute === '00' && tip.hour !== 0) {
      tip.hour -= 1
    }
    if (tip.hour === 0 && tip.day !== 0) {
      tip.day -= 1
    }
    return tip
  }
}
var last = 0
export function throttle(fn, t) {
  var now = new Date().getTime()
  if (now - last > t) {
    fn()
    last = new Date().getTime()
  }
}
// 默认输出方法
export default {
  throttle,
  isNumber,
  formatTime,
  formatTimeToDate,
  integer,
  phone,
  formatYearMonth,
  getPastMonths,
  trimStr,
  addressCut,
  addressNameCut,
  cityCut,
  checkUserIdCode,
  checkMilitaryIdCode,
  checkPassPortIdCode,
  getStrByLength,
  getStrByLens,
  deepClone,
  objToArr,
  isJsonString,
  drawText,
  descartes,
  isIPhoneX,
  showToast,
  setMyId,
  getMyId,
  removeMyId,
  setGetUserInfo,
  getGetUserInfo,
  removeGetUserInfo,
  Time,
  formatTimeStamp,
  formatTimeToMD,
  getCaption
}
